Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

card-view.tsx 3.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. 'use client'
  2. import type { FC } from 'react'
  3. import React from 'react'
  4. import { useTranslation } from 'react-i18next'
  5. import { useContext } from 'use-context-selector'
  6. import AppCard from '@/app/components/app/overview/app-card'
  7. import Loading from '@/app/components/base/loading'
  8. import MCPServiceCard from '@/app/components/tools/mcp/mcp-service-card'
  9. import { ToastContext } from '@/app/components/base/toast'
  10. import {
  11. fetchAppDetail,
  12. updateAppSiteAccessToken,
  13. updateAppSiteConfig,
  14. updateAppSiteStatus,
  15. } from '@/service/apps'
  16. import type { App } from '@/types/app'
  17. import type { UpdateAppSiteCodeResponse } from '@/models/app'
  18. import { asyncRunSafe } from '@/utils'
  19. import { NEED_REFRESH_APP_LIST_KEY } from '@/config'
  20. import type { IAppCardProps } from '@/app/components/app/overview/app-card'
  21. import { useStore as useAppStore } from '@/app/components/app/store'
  22. export type ICardViewProps = {
  23. appId: string
  24. isInPanel?: boolean
  25. className?: string
  26. }
  27. const CardView: FC<ICardViewProps> = ({ appId, isInPanel, className }) => {
  28. const { t } = useTranslation()
  29. const { notify } = useContext(ToastContext)
  30. const appDetail = useAppStore(state => state.appDetail)
  31. const setAppDetail = useAppStore(state => state.setAppDetail)
  32. const showMCPCard = isInPanel
  33. const updateAppDetail = async () => {
  34. try {
  35. const res = await fetchAppDetail({ url: '/apps', id: appId })
  36. setAppDetail({ ...res })
  37. }
  38. catch (error) { console.error(error) }
  39. }
  40. const handleCallbackResult = (err: Error | null, message?: string) => {
  41. const type = err ? 'error' : 'success'
  42. message ||= (type === 'success' ? 'modifiedSuccessfully' : 'modifiedUnsuccessfully')
  43. if (type === 'success')
  44. updateAppDetail()
  45. notify({
  46. type,
  47. message: t(`common.actionMsg.${message}`),
  48. })
  49. }
  50. const onChangeSiteStatus = async (value: boolean) => {
  51. const [err] = await asyncRunSafe<App>(
  52. updateAppSiteStatus({
  53. url: `/apps/${appId}/site-enable`,
  54. body: { enable_site: value },
  55. }) as Promise<App>,
  56. )
  57. handleCallbackResult(err)
  58. }
  59. const onChangeApiStatus = async (value: boolean) => {
  60. const [err] = await asyncRunSafe<App>(
  61. updateAppSiteStatus({
  62. url: `/apps/${appId}/api-enable`,
  63. body: { enable_api: value },
  64. }) as Promise<App>,
  65. )
  66. handleCallbackResult(err)
  67. }
  68. const onSaveSiteConfig: IAppCardProps['onSaveSiteConfig'] = async (params) => {
  69. const [err] = await asyncRunSafe<App>(
  70. updateAppSiteConfig({
  71. url: `/apps/${appId}/site`,
  72. body: params,
  73. }) as Promise<App>,
  74. )
  75. if (!err)
  76. localStorage.setItem(NEED_REFRESH_APP_LIST_KEY, '1')
  77. handleCallbackResult(err)
  78. }
  79. const onGenerateCode = async () => {
  80. const [err] = await asyncRunSafe<UpdateAppSiteCodeResponse>(
  81. updateAppSiteAccessToken({
  82. url: `/apps/${appId}/site/access-token-reset`,
  83. }) as Promise<UpdateAppSiteCodeResponse>,
  84. )
  85. handleCallbackResult(err, err ? 'generatedUnsuccessfully' : 'generatedSuccessfully')
  86. }
  87. if (!appDetail)
  88. return <Loading />
  89. return (
  90. <div className={className || 'mb-6 grid w-full grid-cols-1 gap-6 xl:grid-cols-2'}>
  91. <AppCard
  92. appInfo={appDetail}
  93. cardType="webapp"
  94. isInPanel={isInPanel}
  95. onChangeStatus={onChangeSiteStatus}
  96. onGenerateCode={onGenerateCode}
  97. onSaveSiteConfig={onSaveSiteConfig}
  98. />
  99. <AppCard
  100. cardType="api"
  101. appInfo={appDetail}
  102. isInPanel={isInPanel}
  103. onChangeStatus={onChangeApiStatus}
  104. />
  105. {showMCPCard && (
  106. <MCPServiceCard
  107. appInfo={appDetail}
  108. />
  109. )}
  110. </div>
  111. )
  112. }
  113. export default CardView